#ifndef _DIALOG_RESIZE_HELPER_H_
#define _DIALOG_RESIZE_HELPER_H_

BOOL GetChildWindowRect(HWND wnd,UINT id,RECT* child);

class dialog_resize_helper
{
    pfc::array_t<RECT> rects;
    RECT orig_client;
    HWND parent;
    HWND sizegrip;
    unsigned min_x,min_y,max_x,max_y;

public:
    struct param
    {
        unsigned short id;
        unsigned short flags;
    };
private:
    pfc::array_t<param> m_table;

    void set_parent(HWND wnd);
    void reset();
    void on_wm_size();
public:
    inline void set_min_size(unsigned x,unsigned y)
    {
        min_x = x;
        min_y = y;
    }
    inline void set_max_size(unsigned x,unsigned y)
    {
        max_x = x;
        max_y = y;
    }
    void add_sizegrip();

    enum
    {
        X_MOVE = 1, X_SIZE = 2, Y_MOVE = 4, Y_SIZE = 8,
        XY_MOVE = X_MOVE|Y_MOVE, XY_SIZE = X_SIZE|Y_SIZE,
        X_MOVE_Y_SIZE = X_MOVE|Y_SIZE, X_SIZE_Y_MOVE = X_SIZE|Y_MOVE,
    };
    //the old way
    bool process_message(HWND wnd,UINT msg,WPARAM wp,LPARAM lp);

    //ATL-compatible
    BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult);

    dialog_resize_helper(const param * src,unsigned count,unsigned p_min_x,unsigned p_min_y,unsigned p_max_x,unsigned p_max_y);

    ~dialog_resize_helper();

    PFC_CLASS_NOT_COPYABLE_EX(dialog_resize_helper);
};

#endif
